package com.socialsoftware.api;

import android.util.Log;

import com.socialsoftware.util.JwtTokenUtil;
import com.socialsoftware.util.SessionManager;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

/**
 * HTTP拦截器，用于自动为请求添加认证令牌
 */
public class AuthInterceptor implements Interceptor {
    
    private static final String TAG = "AuthInterceptor";
    
    private final SessionManager sessionManager;
    
    public AuthInterceptor(SessionManager sessionManager) {
        this.sessionManager = sessionManager;
    }
    
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request originalRequest = chain.request();
        
        // 跳过认证端点（登录/注册/刷新令牌）
        if (isAuthEndpoint(originalRequest)) {
            return chain.proceed(originalRequest);
        }
        
        // 如果用户未登录或没有认证令牌，直接发送原始请求
        if (!sessionManager.isLoggedIn()) {
            return chain.proceed(originalRequest);
        }
        
        String authToken = sessionManager.getAuthToken();
        if (authToken == null || !JwtTokenUtil.validateToken(authToken)) {
            // 令牌无效，可能需要重新登录
            Log.w(TAG, "无效的认证令牌，跳过添加Authorization头");
            return chain.proceed(originalRequest);
        }
        
        // 如果令牌即将过期，可以在这里实现自动刷新令牌的逻辑
        if (sessionManager.isTokenNeedsRefresh()) {
            Log.d(TAG, "Auth token is about to expire, consider refreshing");
            // TODO: 实现令牌刷新逻辑
            // 这需要异步请求新令牌，然后更新会话管理器
        }
        
        // 克隆原始请求并添加认证头
        Request.Builder requestBuilder = originalRequest.newBuilder()
                .header("Authorization", "Bearer " + authToken)
                .method(originalRequest.method(), originalRequest.body());
        
        // 如果是刷新令牌请求，可以添加特殊标记以避免递归刷新
        if (isTokenRefreshRequest(originalRequest)) {
            requestBuilder.tag("token_refresh");
        }
        
        Request authenticatedRequest = requestBuilder.build();
        
        return chain.proceed(authenticatedRequest);
    }
    
    /**
     * 检查请求是否是认证相关端点（登录/注册/刷新令牌）
     */
    private boolean isAuthEndpoint(Request request) {
        String url = request.url().toString().toLowerCase();
        return url.contains("/auth/login")
                || url.contains("/auth/register")
                || url.contains("/auth/refresh-token");
    }
    
    /**
     * 检查请求是否是刷新令牌请求
     */
    private boolean isTokenRefreshRequest(Request request) {
        Object tag = request.tag();
        return tag != null && tag.equals("token_refresh");
    }
} 